home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-22 | 3.6 KB | 189 lines | [TEXT/MPS ] |
- /*********************************************************************
- Project : MacPerl - Standalone Perl
- File : MPPseudoFile.cp - Pseudo files for GUSI
- Author : Matthias Neeracher
- Language : MPW C/C++
- $Log: MPPseudoFile.cp,v $
- Revision 1.1 1994/02/27 23:05:08 neeri
- Initial revision
-
- *********************************************************************/
-
- #include <GUSIFile_P.h>
-
- #include <ioctl.h>
- #include <sys/types.h>
- #include <Resources.h>
- #include <TextUtils.h>
-
- extern "C" {
- #include "MPGlobals.h"
- }
-
- #include "MPPseudoFile.h"
-
- #undef open
-
- #define AF_PSEUDO 18
-
- class MPPseudoSocket; // That's what this file's all about
-
- class MPPseudoSocket : public Socket {
- friend class MPPseudoSocketDomain;
-
- MPPseudoSocket(Handle hdl);
-
- virtual ~MPPseudoSocket();
-
- Handle data;
- long readEnd;
- long readPtr;
- public:
- virtual int read(void * buffer, int buflen);
- virtual int select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
- virtual int ioctl(unsigned int request, void *argp);
- virtual long lseek(long offset, int whence);
- };
-
- class MPPseudoSocketDomain : public FileSocketDomain {
- public:
- MPPseudoSocketDomain() : FileSocketDomain(AF_PSEUDO, true, false) { }
-
- virtual Boolean Yours(const GUSIFileRef & ref, Request request);
- virtual Socket * open(const GUSIFileRef & ref, int oflag);
- };
-
- MPPseudoSocketDomain MPPseudoSockets;
-
- #if !defined(powerc) && !defined(__powerc)
- #pragma segment MPPseudo
- #endif
-
- /************************ MPPseudoSocket members ************************/
-
- void InitPseudo()
- {
- MPPseudoSockets.DontStrip();
- }
-
- MPPseudoSocket::MPPseudoSocket(Handle hdl)
- : data(hdl)
- {
- readPtr = 0;
- readEnd = GetHandleSize(data);
- }
-
- MPPseudoSocket::~MPPseudoSocket()
- {
- DisposeHandle(data);
- }
-
- int MPPseudoSocket::ioctl(unsigned int request, void *argp)
- {
- switch (request) {
- case FIONREAD:
- *(unsigned long *) argp = readEnd - readPtr;
-
- return 0;
- default:
- return GUSI_error(EOPNOTSUPP);
- }
- }
-
- int MPPseudoSocket::read(void * buffer, int buflen)
- {
- buflen = min(int(readEnd - readPtr), buflen);
-
- memcpy(buffer, (*data) + readPtr, buflen);
-
- readPtr += buflen;
-
- return buflen;
- }
-
- int MPPseudoSocket::select(Boolean * canRead, Boolean * canWrite, Boolean * exception)
- {
- int goodies = 0;
-
- if (canRead)
- if (*canRead = readEnd > readPtr)
- ++goodies;
-
- if (canWrite)
- *canWrite = false;
-
- if (exception)
- *exception = false;
-
- return goodies;
- }
-
- long MPPseudoSocket::lseek(long offset, int whence)
- {
- long nuReadPtr;
-
- switch (whence) {
- case SEEK_END:
- nuReadPtr = readEnd + offset;
- break;
- case SEEK_CUR:
- nuReadPtr = readPtr + offset;
- break;
- case SEEK_SET:
- nuReadPtr = offset;
- break;
- default:
- return GUSI_error(EINVAL);
- }
-
- if (nuReadPtr > readEnd)
- return GUSI_error(ESPIPE);
- if (nuReadPtr < 0)
- return GUSI_error(EINVAL);
-
- return readPtr = nuReadPtr;
- }
-
- /********************* MPPseudoSocketDomain member **********************/
-
- Boolean MPPseudoSocketDomain::Yours(const GUSIFileRef & ref, FileSocketDomain::Request)
- {
- char name[8];
-
- strncpy(name, ref.name+4, 6);
- name[6] = 0;
-
- return equalstring(name, (char *) "pseudo", false, true);
- }
-
- Socket * MPPseudoSocketDomain::open(const GUSIFileRef & ref, int flags)
- {
- Socket * sock = nil;
-
- if ((flags & O_ACCMODE) != O_RDONLY)
- return (Socket *) GUSI_error_nil(EPERM);
-
- if (!ref.name[10]) {
- sock = new MPPseudoSocket(gPseudoFile);
-
- gPseudoFile = nil;
- } else {
- short res = CurResFile();
- Handle data;
-
- UseResFile(gScriptFile);
-
- data = getnamedresource('TEXT', (char *) ref.name+11);
-
- if (data) {
- DetachResource(data);
-
- sock = new MPPseudoSocket(data);
- }
-
- UseResFile(res);
- }
-
- return sock;
- }
-